package com.ssyt.yt1.day15;

import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.regex.Pattern;

/**
 * 异常的处理
 * 
 * @author Administrator
 *
 */
public class ExceptionDemo1 {

	/**
	 * 在没有异常机制前，我们的异常处理得全部使用穷举的形式，但使用穷举的形式会出现两个严重的问题：<br/>
	 * 1、很容易异常处理的不够完善<br/>
	 * 2、有很多的if...else，代码混杂，不易维护，可读性
	 * 
	 * @param args
	 */
	public static void test1(String[] args) {
		if (args.length == 2) {
			String a = args[0];
			String b = args[1];
			Pattern pattern = Pattern.compile("^\\d+$");
			boolean aResult = pattern.matcher(a).matches();
			boolean bResult = pattern.matcher(b).matches();
			if (aResult && bResult) {
				int number1 = Integer.parseInt(a);
				int number2 = Integer.parseInt(b);
				if (number2 != 0) {
					System.out.println(number1 / number2);
				} else {
					System.err.println("除数不能为0！");
				}
			} else {
				System.err.println("输入的类型必须是数字！");
			}
		} else {
			System.err.println("输入的长度必须为2个！");
		}
	}

	/**
	 * Java的异常处理机制：try...catch...
	 * 
	 * @param args
	 */
	public static void test2(String[] args) {
		try {
			int number1 = Integer.parseInt(args[0]);
			int number2 = Integer.parseInt(args[1]);
			System.out.println(number1 / number2);
		} catch (ArithmeticException e) {
			System.err.println("除数不能为0！");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.err.println("输入的长度至少为2个！");
		} catch (Exception e) {
			// System.out.println(e);
			// e.printStackTrace();
			System.err.println("输入不合法！");
		}
	}

	/**
	 * Java的异常处理机制：try...catch...
	 * 
	 * @param args
	 */
	public static void test3(String[] args) {
		try {
			if (args.length != 2) {
				// throw new IllegalArgumentException();
				throw new IllegalArgumentException("输入的长度必须为2个！");
			}
			int number1 = Integer.parseInt(args[0]);
			int number2 = Integer.parseInt(args[1]);
			System.out.println(number1 / number2);
		} catch (ArithmeticException e) {
			System.err.println("除数不能为0！");
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
			System.err.println("输入的长度必须为2个！");
		} catch (Exception e) {
			// System.out.println(e);
			// e.printStackTrace();
			System.err.println("输入不合法！");
		}
	}

	/**
	 * 异常处理结构：<br/>
	 * try...catch...<br/>
	 * try...catch...catch...<br/>
	 * try...finally...<br/>
	 * try..catch....[catch]...finally的配合使用? <br/>
	 * 面试题 ：请说出final、finally、finalize的区别？
	 * 
	 * @param args
	 */
	public static void test4() {
		// try {
		// System.out.println(1 / 0);
		// } catch (Exception e) {
		// e.printStackTrace();
		// }
		// System.out.println("finished...");

		// try {
		// System.out.println(1 / 0);
		// } finally {
		// // 不管前面是否有异常，finally块里的代码始终会执行！
		// System.out.println("finished...");
		// }

		System.out.println("按规则输入，进行除法去算：");
		Scanner scanner = new Scanner(System.in);
		try {
			System.out.println("输入一个整数：");
			int number1 = scanner.nextInt();
			System.out.println(number1);
			System.out.println("请再输入二个整数：");
			int number2 = scanner.nextInt();
			System.out.println(number2);
			System.out.println("结果为：" + number1 / number2);
		} catch (ArithmeticException e) {
			System.err.println("除数不能为0！");
		} catch (InputMismatchException e) {
			System.err.println("输入必须为整数！");
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("未知异常！");
		} finally {
			scanner.close();
		}
	}

	/**
	 * finally测试<br/>
	 * 1、finally块里面的代码一定会执行吗？<br/>
	 */
	public static void test5() {
		try {
			System.exit(0);
		} finally {
			System.out.println("finished...");
		}
	}

	/**
	 * finally测试<br/>
	 * 2、以下方法的返回值是多少？<br/>
	 */
	public static int test6() {
		try {
			return 0;
		} finally {
			// finally block does not complete normally
			// 结论：在finally块里面永远不要加上return!
			return 1;
		}
	}

	/**
	 * 异常有两种处理方式：<br/>
	 * 1、做好人<br/>
	 * 2、踢皮球<br/>
	 * 
	 * @param info
	 */
	public static int test7(String info) throws Exception {
		// try {
		// return info.length();
		// } catch (NullPointerException e) {
		// // 异常处理：默认值、记录到系统日志文件、给管理员发邮件、给管理员发短信、错误消息推送...
		// return 0;
		// }

		return info.length();
	}

	public static void main(String[] args) {
		// test1(args);
		// test2(args);
		// test3(args);
		// test4();
		// test5();
		// System.out.println(test6());
		try {
			test7("hello world");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
